package com.xh.core.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.xh.core.bean.BaseRequestBean;
import com.xh.core.bean.XhExportHeaderBean;
import org.apache.ibatis.annotations.Param;
import org.apache.poi.ss.usermodel.Workbook;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;

public interface IBaseService<T> {

    /**
     * 通过ID获取实体
     * @param id
     * @return
     */
    public T getById(Serializable id);

    public <S> S getById(Serializable id, Class<S>  clazz);

    /**
     * 返回第一条数据
     * @param w
     * @param <T>
     * @return
     */
    public <T> T selectFirst(@Param("ew") Wrapper<T> w);

    public <S> S selectFirst(@Param("ew") Wrapper<T> w,Class<S> clazz);

    Integer selectCount(@Param("ew") Wrapper<T> w);

    /**
     * 返回指定BEAN的对象
     * @param w
     * @return
     */
    public <S> S selectOne(@Param("ew") Wrapper<T> w,Class<S> clazz);

    /**
     * 返回指定BEAN的列表结果
     * @param w
     * @return
     */
    public <S> List<S> selectList(@Param("ew") Wrapper<T> w,Class<S> clazz);

    /**
     * 返回指定BEAN的分页结果
     * @param w
     * @return
     */
    public <S> IPage<S> selectPage(IPage var1, @Param("ew") Wrapper<T> w,Class<S> clazz);

    /**
     * 新增实体
     * @param entity
     * @return
     */
    public boolean insert(T entity);

    /**
     * 通过BEAN新增实体
     */
    void insertObj(Object o);

    /**
     * 批量新增
     * @param list
     * @return
     */
    public boolean batchInsert(List<T> list);

    /**
     * 通过BEAN批量新增试题
     */
    public boolean batchInsertObj(List<Object> objects);

    /**
     * 修改实体
     * @param entity
     * @return
     */
    public boolean update(T entity);

    public boolean updateObj(Object o);

    /**
     *  根据 whereWrapper 条件，更新记录
     */
    boolean update(T updateEntity, Wrapper<T> whereWrapper);

    /**
     * 批量修改实体
     * @param list
     * @return
     */
    public boolean batchUpdate(List<T> list);

    public boolean batchUpdateObj(List<Object> objects);

    /**
     * 删除实体
     * @param id
     * @return
     */
    public boolean delete(Serializable id);

    /**
     * 批量删除
     * @param ids
     * @return
     */
    public boolean batchDelete(Serializable[] ids);
    /**
     * 根据条件删除
     * @param qw
     * @return
     */
    public boolean deleteByCondition(QueryWrapper<T> qw);
    /**
     * 查询所有数据
     * @return
     */
    public List<T> queryAll();

    public List<T> queryByCondition(QueryWrapper<T> qw);

    /**
     * 导出数据，返回excel对象
     * @param exportHeaderBeans 导出头部对象列列表
     * @param param 分页查询参数
     * @param queryPageMethodStr 分页查询方法名
     * @return
     * @throws Exception
     */
    public Workbook exportAll(LinkedHashMap<String,XhExportHeaderBean> exportHeaderBeans, BaseRequestBean param, String queryPageMethodStr) throws Exception;

    /**
     * 导出数据，返回下载地址相对路径
     * @param request
     * @param exportHeaderBeans 导出头部对象列列表
     * @param param 分页查询参数
     * @param queryPageMethodStr 分页查询方法名
     * @return
     * @throws Exception
     */
    public String exportAll(HttpServletRequest request, LinkedHashMap<String, XhExportHeaderBean> exportHeaderBeans, BaseRequestBean param, String queryPageMethodStr) throws Exception;

}
